Ana içeriğe geç

Vectors

Hadi vektörlere ve bu vektörler ile bağdaştırılan yöntemlere bakalım. Hadi bir i32 türünde numaralar adında boş bir vektör oluşturarak başlayalım ve bu vektöre push methodu ile bazı veriler yükleyelim.

fn main(){
let mut numaralar:Vec<i32> = vec![];

numaralar.push(1);
numaralar.push(2);
numaralar.push(3);
}

Vektörler içerisinden bir veriyi çıkartmak için .pop() yönetmini kullanabiliriz. Bu yöntem o vektör içerisindeki son elemanı vektör içerisinden çıkaracak ancak kendini de çıkardığı değere ekleyecektir. Yani bir pop methodunu insan gibi düşünebiliriz. Vektörü de bir çamaşır sepeti. Biz bir pop işlem yaptığımızda her nasıl en sondaki en üstteki kıyafeti sepetten çıkarıyorsak ve her nasıl ki sepetten çıkarırken elimizde kalan sepetten çıkardığımız oluyorsa aynı durum pop methodu için de geçerlidir.

fn main(){
let mut numaralar:Vec<i32> = vec![];

numaralar.push(1);
numaralar.push(2);
numaralar.push(3);

let poped = numaralar.pop();

println!("{:?}", numaralar); // [1,2]
println!("{:?}", poped); // Some(3)
}

Pop methodu boş bir liste içerisinde çıkarmaya çalışınca none değeri döndüreceği için bu method Some(T) veya None değeri döndürecektir.

Aynı zamanda vektör içerisinden bir elemana erişirken numaralar[INDEX] yapısını da kullanabiliriz. Burada dikkat etmemiz gereken şey bir i32 gibi stack üzerinde kayıtlı veri tiplerinin copy türünü kullanırken diğer heap üzerinde tutulan veriler için &numaralar[INDEX] yapısı ile copy oluşturulamıyorsa referans oluşturmamızdır.

Vektörler içerisinden verileri elde etmenin birçok yolu vardır. Bunlardan bir diğeri de vektör içerisindeki ilk değeri elde etmemizi sağlayan .first() yapısı ve son veriyi elde etmemizi sağlayan .last() methodudur.

let mut numaralar:Vec<i32> = vec![];
numaralar.push(1);
numaralar.push(2);

let bir = numaralar.first()
println!{"{:?}", bir} // Some(1)

let son = numaralar.last()
println!{"{:?}", son} // Some(2)

Aynı zamanda ownership bakımından daha sağlıklı olması amacıyla bu fonksiyonları mutable referans hali ile kontrol eden hallerini de first_mut ve last_mut şeklinde kullanabiliriz.

Eğer vektörümüzün uzunluğunu kontrol etmek istiyorsak bu işlemi .len() yapısını da kullanabiliriz. Bu işlem sayesinde belirli bir listenin uzunluğunda döngüler çalıştırabiliriz. Aynı şekilde bir listenin dolu veya boş olduğunu da kontrol etmek mümkündür. Bu işlemi .is_empty() yapısı ile geçekleştirebiliriz. Bu işlem bool döndürecektir.

let mut numaralar:Vec<i32> = vec![];
numaralar.push(1);
numaralar.push(2);

let uzunluk = numaralar.len()
println!{"{:?}", uzunluk} // 2

let son = numaralar.is_empty()
println!{"{:?}", son} // False

Daha öncesinde bir listenin içerisine sona ekleme yapmak için .push methodunu kullanmıştık. Ancak bu işlemi spesifik indexler için .insert() methodunu kullanarak yapmamız da mümkündür.

numaralar.insert(1,12); // 1. indexe 12 değerini yerleştirecek

Her nasıl bir vektör içerisindeki son elemanı pop ile çıkarıyorsak aynı şekilde istediğimiz elemanı .remove() yapısı ile de çıkarmamız mümkündür.

numaralar.remove(1); // 1. index'i vektörden çıkar

Ayrıca bir vektörün içerisindeki verileri .sort() ile de alfabetik ve nümerik olarak sıralayabiliriz.

Bazı durumlarda bir listeyi ters çevirmek de işimize yarayabilmektedir. Bu işlemi yaparken de reverse() yapısını kullanabiliriz.

Ayrıca vektörlerimizi karıştırmakta mümkündür. Bu işlem için ilk olarak cargo.toml dosyasına gitmemiz ve bu dosya içerisinde dependencies başlığı altına rand paketi eklemek istediğimizi belirtmemiz gerekmektedir.

[dependencies]
rand = "0.8.4"

Sonrasında geri main.rs dosyamıza gelerek paketimizi ekleyebiliriz.

use rand::seg::SliceRandom;
use rand::thread_rng;

Sonrasında vektörümüzü karıştırmak için alt kısımda kullanılan kodu sistemimize ekleyebiliriz.

nums.suffle(&mut thread_rng());